#Область ПрограммныйИнтерфейс

Процедура ПроверитьЗаполнениеПараметровВыбора(Форма, Элемент, СтандартнаяОбработка) Экспорт
	МодельОбъекта = РаботаСМодельюОбъектаКлиентСервер.ПолучитьМодель(Форма);
	ЭлементФормы = МодельОбъекта.ЭлементыФормы[Элемент.Имя];
	Если НЕ ЗначениеЗаполнено(ЭлементФормы) Тогда
		Возврат;
	КонецЕсли;
	ТекущаяСтрока = ?(ЗначениеЗаполнено(ЭлементФормы.Таблица), Форма.Элементы[ЭлементФормы.Таблица].ТекущаяСтрока, Неопределено);
	Для Каждого ИдентификаторСвязи Из ЭлементФормы.Параметр.ВходящиеСвязи Цикл
		Связь = МодельОбъекта.Связи[ИдентификаторСвязи];
		Если Связь.Слабая ИЛИ НЕ ЗначениеЗаполнено(Связь.ПутьКДанным) Тогда
			Продолжить;
		КонецЕсли;
		Если ЗначениеЗаполнено(Связь.Параметр) Тогда
			Параметр = Связь.Параметр;
			Если ЗначениеЗаполнено(Параметр.ПараметрТаблица) Тогда
				Если ЗначениеЗаполнено(Связь.ПараметрИспользование)
					И (НЕ РаботаСМодельюОбъектаКлиентСервер.ЗначениеСвойстваПараметра(МодельОбъекта, Связь.ПараметрИспользование, ТекущаяСтрока, "Использование")
					ИЛИ НЕ РаботаСМодельюОбъектаКлиентСервер.ПолучитьЗначениеПараметра(МодельОбъекта, Связь.ПараметрИспользование, ТекущаяСтрока))  Тогда
					Продолжить;
				КонецЕсли;
				Если НЕ РаботаСМодельюОбъектаКлиентСервер.ЗначениеСвойстваПараметра(МодельОбъекта, Параметр, ТекущаяСтрока, "ПроверкаЗаполнения") Тогда
					Продолжить;
				КонецЕсли;
				ЗначениеПараметра = РаботаСМодельюОбъектаКлиентСервер.ПолучитьЗначениеПараметра(МодельОбъекта, Параметр, ТекущаяСтрока);
			Иначе
				Если ЗначениеЗаполнено(Связь.ПараметрИспользование)
					И (НЕ РаботаСМодельюОбъектаКлиентСервер.ЗначениеСвойстваПараметра(МодельОбъекта, Связь.ПараметрИспользование, , "Использование")
					ИЛИ НЕ РаботаСМодельюОбъектаКлиентСервер.ПолучитьЗначениеПараметра(МодельОбъекта, Связь.ПараметрИспользование))  Тогда
					Продолжить;
				КонецЕсли;
				Если НЕ РаботаСМодельюОбъектаКлиентСервер.ЗначениеСвойстваПараметра(МодельОбъекта, Параметр, , "Использование")
					ИЛИ НЕ РаботаСМодельюОбъектаКлиентСервер.ЗначениеСвойстваПараметра(МодельОбъекта, Параметр, , "ПроверкаЗаполнения") Тогда
					Продолжить;
				КонецЕсли;
				ЗначениеПараметра = РаботаСМодельюОбъектаКлиентСервер.ПолучитьЗначениеПараметра(МодельОбъекта, Параметр);
			КонецЕсли;
			Если НЕ ЗначениеЗаполнено(ЗначениеПараметра) Тогда
				ТекстСообщения	= "Не заполнено значение "+Параметр.Имя;
				Если ЗначениеЗаполнено(Параметр.ПараметрТаблица) Тогда
					ИмяРеквизита = ОбщийКлиентСервер.ОкончаниеСтрокиПослеРазделителя(Параметр.ПутьКДанным, ".");
					Поле = СтрШаблон("%1[%2].%3", РаботаСМодельюОбъектаКлиентСервер.ПутьКДанным(МодельОбъекта, Параметр.ПараметрТаблица), Формат(ТекущаяСтрока, "ЧН=0; ЧГ=;"), ИмяРеквизита);
				Иначе
					Поле = РаботаСМодельюОбъектаКлиентСервер.ПутьКДанным(МодельОбъекта, Параметр);
				КонецЕсли;
				СтандартнаяОбработка = Ложь;
				ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения, , Поле);
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

#Область ОбработчикиСобытийТаблицыФормыВМоделиСостояния

Процедура ПриОткрытииВМоделиФормы(Форма, Отказ) Экспорт
	Форма.ОтложенныеПараметры = Новый Массив;
	//@skip-check structure-consructor-too-many-keys
	Форма.СостояниеТаблицыФормы = Новый Структура("РедактированиеСтроки, НоваяСтрока, ТекущиеДанные, ТекущийЭлемент", Ложь, Ложь);
КонецПроцедуры

Процедура ВыборСтрокиТаблицыФормы(Форма, ТаблицаФормы, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) Экспорт
	Если НЕ (Поле.ТолькоПросмотр ИЛИ Поле.Родитель.ТолькоПросмотр ИЛИ ТаблицаФормы.ТолькоПросмотр ИЛИ Форма.ТолькоПросмотр) Тогда
		Возврат;
	КонецЕсли;
	МодельОбъекта = РаботаСМодельюОбъектаКлиентСервер.ПолучитьМодель(Форма);
	ЭлементФормыПоле = МодельОбъекта.ЭлементыФормы[Поле.Имя];
	Если ЭлементФормыПоле = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Значение = РаботаСМодельюОбъектаКлиентСервер.ПолучитьЗначениеПараметра(МодельОбъекта, ЭлементФормыПоле.Параметр, ВыбраннаяСтрока);
	ПоказатьЗначение(, Значение);
КонецПроцедуры

Процедура ПриАктивизацииСтрокиТаблицыФормы(Форма, ТаблицаФормы) Экспорт
	ОтложенныеПараметры = Форма.ОтложенныеПараметры;
	СостояниеТаблицыФормы = Форма.СостояниеТаблицыФормы;
	РасчетныйПараметрТекущейСтроки = РаботаСМодельюФормыКлиентСервер.ПриАктивизацииСтроки(Форма, ТаблицаФормы);
	Если РасчетныйПараметрТекущейСтроки <> Неопределено Тогда
		ОтложенныеПараметры.Добавить(РасчетныйПараметрТекущейСтроки);
	КонецЕсли;
	Если НЕ СостояниеТаблицыФормы.РедактированиеСтроки И ЗначениеЗаполнено(ОтложенныеПараметры) Тогда
		Форма.ПодключитьОбработчикОжидания("РассчитатьОтложенныеПараметры", 0.1, Истина);
	КонецЕсли;
КонецПроцедуры

Процедура ПередНачаломДобавленияСтрокиТаблицыФормы(Форма, ТаблицаФормы, Отказ = Ложь, Копирование = Ложь, Родитель = Неопределено, Группа = Неопределено, Параметр = Неопределено, ДобавитьПодчиненный = Ложь) Экспорт
	СостояниеТаблицыФормы = Форма.СостояниеТаблицыФормы;
//	Если СостояниеТаблицыФормы.РедактированиеСтроки Тогда
//		Возврат;
//	КонецЕсли;
	СостояниеТаблицыФормы.НоваяСтрока = Истина;
	//СостояниеТаблицыФормы.РедактированиеСтроки = Истина;
	Если ТаблицаФормы.ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли;
	МодельОбъекта = РаботаСМодельюОбъектаКлиентСервер.ПолучитьМодель(Форма);
	ЭлементТаблицы = МодельОбъекта.ЭлементыФормы[ТаблицаФормы.Имя];
	ПараметрТаблицы = ЭлементТаблицы.Параметр;
	Таблица = РаботаСМодельюОбъектаКлиентСервер.ПолучитьЗначениеПараметра(МодельОбъекта, ПараметрТаблицы);
	Если ТипЗнч(Таблица) = Тип("ДанныеФормыДерево") Тогда
		Отказ = Истина;
		Если ТаблицаФормы.ТекущаяСтрока = Неопределено Тогда
			ЭлементНовойСтроки = Таблица.ПолучитьЭлементы().Добавить();
			ТаблицаФормы.ТекущаяСтрока = ЭлементНовойСтроки.ПолучитьИдентификатор();
			ТаблицаФормы.ИзменитьСтроку();
			Возврат;
		КонецЕсли;
		ЭлементТекущейСтроки = Таблица.НайтиПоИдентификатору(ТаблицаФормы.ТекущаяСтрока);
		Родитель = ЭлементТекущейСтроки.ПолучитьРодителя();
		Если Родитель = Неопределено Тогда
			ЭлементНовойСтроки = Таблица.ПолучитьЭлементы().Добавить();
		Иначе
			Если ДобавитьПодчиненный Тогда
				ЭлементНовойСтроки = ЭлементТекущейСтроки.ПолучитьЭлементы().Добавить();
			Иначе
				ЭлементНовойСтроки = Родитель.ПолучитьЭлементы().Добавить();
			КонецЕсли;
		КонецЕсли;
		ТаблицаФормы.ТекущаяСтрока = ЭлементНовойСтроки.ПолучитьИдентификатор();
		ТаблицаФормы.ИзменитьСтроку();
	КонецЕсли;
КонецПроцедуры

Процедура ПередНачаломИзмененияСтрокиТаблицыФормы(Форма, ТаблицаФормы, Отказ) Экспорт
	Если ТаблицаФормы.ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли;
	МодельОбъекта = РаботаСМодельюОбъектаКлиентСервер.ПолучитьМодель(Форма);
	ПараметрТаблицы = МодельОбъекта.ЭлементыФормы[ТаблицаФормы.Имя].Параметр;
	ТекущиеДанныеТаблицы = ТаблицаФормы.ТекущиеДанные;
	ТекущиеДанные = Новый Структура();
	Для Каждого ЭлементКолонки Из ПараметрТаблицы.ПараметрыКолонок Цикл
		ТекущиеДанные.Вставить(ЭлементКолонки.Ключ, ТекущиеДанныеТаблицы[ЭлементКолонки.Ключ]);
	КонецЦикла;
	Форма.СостояниеТаблицыФормы.ТекущиеДанные = ТекущиеДанные;
	Форма.СостояниеТаблицыФормы.РедактированиеСтроки = Истина; 
КонецПроцедуры

Процедура ПередОкончаниемРедактированияСтрокиТаблицыФормы(Форма, ТаблицаФормы, НоваяСтрока, ОтменаРедактирования, Отказ) Экспорт
	МодельОбъекта = РаботаСМодельюОбъектаКлиентСервер.ПолучитьМодель(Форма);
	ПараметрТаблицы = МодельОбъекта.ЭлементыФормы[ТаблицаФормы.Имя].Параметр;
	ПутьКДанным = ПараметрТаблицы.ПутьКДанным;
	Таблица = РаботаСМодельюОбъектаКлиентСервер.ПолучитьЗначениеПараметра(МодельОбъекта, ПараметрТаблицы);
	ЭлементТекущейСтроки = Таблица.НайтиПоИдентификатору(ТаблицаФормы.ТекущаяСтрока);
	Если ОтменаРедактирования Тогда
		Если НоваяСтрока Тогда
			Возврат;
		КонецЕсли;
		ЗаполнитьЗначенияСвойств(ЭлементТекущейСтроки, Форма.СостояниеТаблицыФормы.ТекущиеДанные);
		Возврат;
	КонецЕсли;
	Если НЕ ЗначениеЗаполнено(ПараметрТаблицы.Ключ) Тогда
		Возврат;
	КонецЕсли;
	НезаполненныеРеквизитыТаблицы = Новый Массив;
	Для Каждого ЭлементКолонки Из ПараметрТаблицы.ПараметрыКолонок Цикл
		Параметр = МодельОбъекта.ПараметрыСостояния[ЭлементКолонки.Значение];
		Если НЕ ЗначениеЗаполнено(Параметр) Тогда
			Продолжить;
		КонецЕсли;
		Если ЗначениеЗаполнено(ЭлементТекущейСтроки[ЭлементКолонки.Ключ])
			ИЛИ НЕ РаботаСМодельюОбъектаКлиентСервер.ЗначениеСвойстваПараметра(МодельОбъекта, Параметр, ТаблицаФормы.ТекущаяСтрока, "ПроверкаЗаполнения")
			ИЛИ НЕ РаботаСМодельюОбъектаКлиентСервер.ЗначениеСвойстваПараметра(МодельОбъекта, Параметр, ТаблицаФормы.ТекущаяСтрока, "Использование") Тогда
			Продолжить;
		КонецЕсли;
		НезаполненныеРеквизитыТаблицы.Добавить(Параметр.Имя);
	КонецЦикла;
	Если ЗначениеЗаполнено(НезаполненныеРеквизитыТаблицы) Тогда
	    ТекстСообщения = СтрШаблон("Не заполнены значения обязательных полей: ""%1""", СтрСоединить(НезаполненныеРеквизитыТаблицы, ", "));
		ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения, , ТаблицаФормы.Имя, ПутьКДанным, Отказ);
		Возврат;
	КонецЕсли;
	СтруктураКлюча = Новый Структура(ПараметрТаблицы.Ключ);
	ЗаполнитьЗначенияСвойств(СтруктураКлюча, ЭлементТекущейСтроки);
	Если ТипЗнч(Таблица) = Тип("ДанныеФормыДерево") Тогда
		Родитель = ЭлементТекущейСтроки.ПолучитьРодителя();
		Если Родитель = Неопределено Тогда
			Строки = Таблица.ПолучитьЭлементы();
		Иначе
			Строки = Родитель.ПолучитьЭлементы();
		КонецЕсли;
		НайденныеСтроки = Новый Массив;
		Для каждого Строка Из Строки Цикл
			НайденоРазличие = Ложь;
			Для каждого ЭлементКлюча Из СтруктураКлюча Цикл
				Если Строка[ЭлементКлюча.Ключ] <> ЭлементКлюча.Значение Тогда
					НайденоРазличие = Истина;
					Прервать;
				КонецЕсли;
			КонецЦикла;
			Если НЕ НайденоРазличие Тогда
				НайденныеСтроки.Добавить(Строка);
			КонецЕсли;
		КонецЦикла;
	Иначе
		НайденныеСтроки = Таблица.НайтиСтроки(СтруктураКлюча);
	КонецЕсли;
	Если НайденныеСтроки.Количество() > 1 Тогда
	    ТекстСообщения = СтрШаблон("Найден повтор аналитик (%1)! Исправьте или отмените ввод.", ПараметрТаблицы.Ключ);
		ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения, , ТаблицаФормы.Имя, ПутьКДанным, Отказ);
	КонецЕсли;
КонецПроцедуры

Процедура ПередУдалениемСтрокиТаблицыФормы(Форма, ТаблицаФормы, Отказ) Экспорт
	МодельОбъекта = РаботаСМодельюОбъектаКлиентСервер.ПолучитьМодель(Форма);
	ПараметрТаблицы = МодельОбъекта.ЭлементыФормы[ТаблицаФормы.Имя].Параметр;
	УдалитьТекущуюСтрокуТаблицыФормы(Форма, ТаблицаФормы, РаботаСМодельюОбъектаКлиентСервер.ПутьКДанным(МодельОбъекта, ПараметрТаблицы), Отказ);
	Форма.ОтложенныеПараметры.Добавить(РаботаСМодельюФормыКлиентСервер.ПолучитьРасчетныйПараметрЭлементаФормы(Форма, ТаблицаФормы.Имя));
	Форма.ПодключитьОбработчикОжидания("РассчитатьОтложенныеПараметры", 0.1, Истина);
КонецПроцедуры

Процедура ПриНачалеРедактированияСтрокиТаблицыФормы(Форма, ТаблицаФормы, НоваяСтрока, Копирование) Экспорт
	Форма.СостояниеТаблицыФормы.ТекущийЭлемент = ТаблицаФормы.ТекущийЭлемент;
КонецПроцедуры

Процедура ПриОкончанииРедактированияСтрокиТаблицыФормы(Форма, ТаблицаФормы, НоваяСтрока, ОтменаРедактирования) Экспорт
	СостояниеТаблицыФормы = Форма.СостояниеТаблицыФормы;
	ТаблицаФормы.ТекущийЭлемент = СостояниеТаблицыФормы.ТекущийЭлемент;
	МодельОбъекта = РаботаСМодельюОбъектаКлиентСервер.ПолучитьМодель(Форма);
	ПараметрТаблицы = МодельОбъекта.ЭлементыФормы[ТаблицаФормы.Имя].Параметр;
	Таблица = РаботаСМодельюОбъектаКлиентСервер.ПолучитьЗначениеПараметра(МодельОбъекта, ПараметрТаблицы);
	Если ОтменаРедактирования Тогда
		Если СостояниеТаблицыФормы.НоваяСтрока Тогда
			Если ТипЗнч(Таблица) = Тип("ДанныеФормыДерево") Тогда
				УдалитьТекущуюСтрокуТаблицыФормы(Форма, ТаблицаФормы, РаботаСМодельюОбъектаКлиентСервер.ПутьКДанным(МодельОбъекта, ПараметрТаблицы));
			КонецЕсли;
		Иначе
			ЭлементТекущейСтроки = Таблица.НайтиПоИдентификатору(ТаблицаФормы.ТекущаяСтрока);
			ЗаполнитьЗначенияСвойств(ЭлементТекущейСтроки, СостояниеТаблицыФормы.ТекущиеДанные);
		КонецЕсли;
		СостояниеТаблицыФормы.РедактированиеСтроки = Ложь;
		СостояниеТаблицыФормы.НоваяСтрока = Ложь;
		Возврат;
	КонецЕсли;
	СостояниеТаблицыФормы.РедактированиеСтроки = Ложь;
	СостояниеТаблицыФормы.НоваяСтрока = Ложь;
	Форма.ОтложенныеПараметры.Добавить(РаботаСМодельюФормыКлиентСервер.ПолучитьРасчетныйПараметрЭлементаФормы(Форма, ТаблицаФормы.Имя));
	Форма.ПодключитьОбработчикОжидания("РассчитатьОтложенныеПараметры", 0.1, Истина);
КонецПроцедуры

#КонецОбласти

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Процедура УдалитьТекущуюСтрокуТаблицыФормы(Форма, ТаблицаФормы, ПутьКДанным, Отказ = Ложь)
	Отказ = Истина;
	Таблица = ОбщегоНазначенияКлиентСервер.ПолучитьРеквизитФормыПоПути(Форма, ПутьКДанным);
	ЭлементТекущейСтроки = Таблица.НайтиПоИдентификатору(ТаблицаФормы.ТекущаяСтрока);
	Если ТипЗнч(Таблица) = Тип("ДанныеФормыДерево") Тогда
		ЭлементРодителя = ЭлементТекущейСтроки.ПолучитьРодителя();
		Если ЭлементРодителя = Неопределено Тогда
			ЭлементРодителя = Таблица;
		КонецЕсли;
	    ЭлементыПодчиненныхСтрок = ЭлементРодителя.ПолучитьЭлементы();
		ИндексТекущейСтроки = ЭлементыПодчиненныхСтрок.Индекс(ЭлементТекущейСтроки);
		ЭлементыПодчиненныхСтрок.Удалить(ИндексТекущейСтроки);
		ИндексСтроки = Мин(ИндексТекущейСтроки, ЭлементыПодчиненныхСтрок.Количество() - 1);
		Если ИндексСтроки < 0 Тогда
			Если ЭлементРодителя = Таблица Тогда
				Возврат;
			КонецЕсли;
			ТаблицаФормы.ТекущаяСтрока = ЭлементРодителя.ПолучитьИдентификатор();
		Иначе
			ТаблицаФормы.ТекущаяСтрока = ЭлементыПодчиненныхСтрок[ИндексСтроки].ПолучитьИдентификатор();
		КонецЕсли;
	Иначе 
		Таблица.Удалить(ЭлементТекущейСтроки);
	КонецЕсли;
КонецПроцедуры

#КонецОбласти
